package com.gl.codingdojo.buscaminas;

public class CeldaVacia extends Celda {

	private int bombasAdjacentes = 0;
	private int myX;
	private int myY;

	public CeldaVacia(Buscaminas buscaminas, int myX, int myY) {
		super(buscaminas);
		this.myX = myX;
		this.myY = myY;
	}

	public void pisar() {
		destapar();
		calcularAdjacentes();
		
		if( bombasAdjacentes == 0 )
		{
			pisarSeguro();
		}
		
	}

	public String toString()
	{
		if( !estaTapada() )
			return ""+bombasAdjacentes;
		else 
			return super.toString();
	}
	
	public boolean tieneBomba() {
		return false;
	}
	
	private void calcularAdjacentes()
	{
		new CeldaIterator() {
			public void execute(int x, int y) {
				if( buscaminas.hayBomba(myX + x, myY + y) )
				{
					bombasAdjacentes ++;
				}
			}
		}.iterate();
	}

	private void pisarSeguro()
	{
		new CeldaIterator() {
			public void execute(int x, int y) {
				buscaminas.pisar(myX + x, myY + y);
			}
		}.iterate();
	}
	
	private abstract class CeldaIterator {
		
		private static final int CELDA_ACTUAL = 0;
		private static final int CELDA_POSTERIOR = 1;
		private static final int CELDA_ANTERIOR = -1;

		public void iterate()
		{
			for( int x = CELDA_ANTERIOR; x <= CELDA_POSTERIOR; x++ )
			{
				for( int y = CELDA_ANTERIOR; y <= CELDA_POSTERIOR; y++ )
				{
					if( !( x == CELDA_ACTUAL && y == CELDA_ACTUAL ) )
					{
						execute( x, y );
					}
				}
			}
			
		}

		abstract public void execute(int x, int y);
	}


}
